package interview.sort;//Java 代码实现

import com.study.interfaces.IArraySort;
import org.junit.Test;

import static com.study.util.LogUtil.info;

/**
 * 8. 计数排序
 * <p>
 * 花O(n)的时间扫描一下整个序列 A，获取最小值 min 和最大值 max
 * 开辟一块新的空间创建新的数组 B，长度为 ( max - min + 1)
 * 数组 B 中 index 的元素记录的值是 A 中某元素出现的次数
 * 最后输出目标整数序列，具体的逻辑是遍历数组 B，输出相应元素以及对应的个数
 */
public class CountingSort implements IArraySort {

    @Override
    public int[] sort(int[] arr) {

        int max = getMaxValue(arr);

        int[] bucket = new int[max + 1];
        for (int value : arr) {
            bucket[value]++;
        }

        int sortedIndex = 0;
        for (int j = 0; j < max + 1; j++) {
            while (bucket[j] > 0) {
                arr[sortedIndex++] = j;
                bucket[j]--;
            }
        }
        return arr;
    }

    private int getMaxValue(int[] arr) {
        int maxValue = arr[0];
        for (int value : arr) {
            if (maxValue < value) {
                maxValue = value;
            }
        }
        return maxValue;
    }

    @Test
    public void test() {
        info(sort(new int[]{2, 5, 3, 1, 4, 7, 6, 8, 9, 10}));
    }
}